﻿#pragma once

#include "../GameplayController.h"
#include "../../../domain/network/GameClient.h"
#include "../../../utils/gui/Form.h"

namespace Controllers {

	class ClientController: public GameplayController
	{
		Domain::Network::GameClient* client; /**< Klient gry */
		Views::IClientGameplayView* client_view; /**< Specjalny widok dla funkcji związanych obsługą połączenia z serwerem */

	public:
		ClientController(Utils::GUI::Form*);
		virtual ~ClientController();

		virtual void startGame(); /**< Pyta gracza o adres serwera gry */
	protected:
		/**
		* Tworzy odpowiednie kontrolery, wybiera widok z przestrzeni nazw Views::Client dla gracza użytkownika programu i
		* Views::Remote dla pozostałych graczy
		*/
		virtual TurnController* createTurnController();
		virtual Players::Player* createPlayer(Cards::PlayerCard*, Players::PLAYER_TYPE);
		/**
		* Nie wykonuje żadnej operacji
		* @see dealCards(sf::Packet)
		*/
		virtual void dealCards();
		/**
		* Ustawia karty zgodnie z informacjami przesłanymi przez serwer.
		* @param packet Pakiet z informacjami o kartach wszystkich graczy.
		*/
		virtual void dealCards(sf::Packet);
		/**
		* Ustanawia połączenie z serwerem lub w przypadku nie znalezienia serwera pod tym adresem, ponownie pyta o adres
		* @param address Adres serwera, do którego program ma się połączyć
		*/
		virtual void connectToServer(sf::IPAddress address);

		virtual void endGame(Domain::Configuration::GAME_END_REASON);
	};
}

